﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Text;
using System.IO;
using Web.Framework;
using System.Web.SessionState;
using WebAppPlanProduccion.Code;
using PlanProd.Contracts;
using System.ServiceModel;
using WebAppPlanProduccion.ServiceReference.PlanProdAdmin;
using PlanProd.Contracts.Validation;
using Web.Framework.Svc;

namespace WebAppPlanProduccion.Handler
{
    /// <summary>
    /// Summary description for FileUploadHandler
    /// </summary>
    public class FileUploadPedidoComercialHandler : IHttpHandler, IRequiresSessionState
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "text/plain";
            string response = "Archivo Procesado Correctamente";
            string filePath = string.Empty;
            List<string> parseErrors = new List<string>();
            try
            {
                if (context.Request.QueryString.Count > 0)
                {
                    int pedidoComercialId = Convert.ToInt32(context.Request.QueryString["pedidoComercialId"]);
                    string fileName = Path.GetFileName(context.Request.Files[0].FileName);
                    string tmpPath = HttpContext.Current.Server.MapPath("/Tmp");
                    fileName = fileName + Guid.NewGuid().ToString();
                    filePath = Path.Combine(tmpPath, fileName);
                    context.Request.Files[0].SaveAs(filePath);

                    WebServiceHelper webServiceHelper = new Code.WebServiceHelper();
                    webServiceHelper.ServiceOptionsDefault = new ServiceOptions();
                    webServiceHelper.ServiceOptionsDefault.UserName = Convert.ToString(context.User.Identity.Name);

                    PedidoComercial pedidoComercialCabecera = webServiceHelper.GetPedidosComerciales(pedidoComercialId, null, null, null, null, null).Single();


                    List<PedidoComercialDetalle> detalles = ExcelHelper.GetPedidoComercialDetalleFromExcel(filePath, pedidoComercialCabecera, parseErrors);

                    List<ProductoValidation> productosAValidar = new List<ProductoValidation>();
                    foreach (var detallePedidoComercial in detalles)
                    {
                        productosAValidar.Add(new ProductoValidation()
                        {
                            Producto = detallePedidoComercial.ProductoIdExterno,
                            ColorId = detallePedidoComercial.ColorId
                        });
                    }

                    List<ProductoValidation> productosValidados = webServiceHelper.ValidarProductos(productosAValidar);

                    if (parseErrors.Count == 0 && productosValidados.Count == 0)
                    {
                        detalles.ForEach(d => d.PedidoComercialId = pedidoComercialId);
                        webServiceHelper.UpdatePedidoComercialDetalle(detalles);
                    }
                    else
                    {
                        StringBuilder builder = new StringBuilder();
                        foreach (string parseError in parseErrors)
                        {
                            builder.AppendLine(parseError);
                        }

                        if(productosValidados.Count > 0)
                        {
                            builder.AppendLine("Los siguientes productos no existen en la base de datos:");
                            foreach (ProductoValidation productoInexistente in productosValidados)
                            {
                                builder.AppendLine(string.Format("Producto: {0}, Color: {1}", productoInexistente.Producto, productoInexistente.ColorId));
                            }
                        }
                      
                        response = builder.ToString();
                    }
                }
            }
            catch (FaultException<WebFrameworkFaultException> ex)
            {
                response = ex.Detail.Message;
                ExceptionManager.Instance.HandleException(ex);
            }
            catch (Exception ex)
            {
                response = ex.Message;
                ExceptionManager.Instance.HandleException(ex);
            }
            finally
            {
                if (File.Exists(filePath))
                {
                    File.Delete(filePath);
                }
            }

            context.Response.ClearContent();
            context.Response.Write(response);
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}